java第三方登录(微博,QQ)详细代码 您所在的位置:网站首页 java 第三方登录 java第三方登录(微博,QQ)详细代码

java第三方登录(微博,QQ)详细代码

2024-01-19 01:29| 来源: 网络整理| 查看: 265

第三方登录,首先需要设计扩展性的表结构。参照如下:本文主要写第三方登录的代码。

  浅谈数据库用户设计:http://www.cnblogs.com/jiqing9006/p/5937733.html

  可绑定可扩展的账号系统:http://blog.cocosdever.com/2016/03/08/The-design-principle-and-implementation-of-extensible-account-system-1/

 

第三方登录流程是:先获取code---->然后获取access_token----->根据token获取用户信息。

前台页面实现步骤:点击微博登录按钮---->打开一个子窗口,进行授权------>授权完成,跳转到首页或上次浏览的页面。

1、写第三方登录的按钮,点击按钮时,打开一个子窗口。

redirect_uri是你在微博上设置的回调地址。

DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> My JSP 'index.jsp' starting page var qqAuthWin,weiboAuthWin; /** * 关闭QQ子窗口 */ function closeQQWin(){ var result = $("#qq").val(); if(result != ""){ console.log(result); qqAuthWin.close(); }else{ console.log("值为空"); } } /** * QQ登录 * http://localhost:9090/logback/qq.jsp QQ互联上设置的回调地址 */ function loginQQ(){ qqAuthWin = window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=register&redirect_uri=http://localhost:9090/logback/qq.jsp", 'QQ授权登录','width=770,height=600,menubar=0,scrollbars=1,'+ 'resizable=1,status=1,titlebar=0,toolbar=0,location=1'); } /** * 关闭微博子窗口 */ function closeWeiboWin(){ var result = $("#weibo").val(); if(result != ""){ console.log(result); weiboAuthWin.close(); }else{ console.log("值为空"); } } /** * 微博登录 * http://localhost:9090/logback/weibo.jsp这个就是在微博上设置的回调地址 */ function loginWeibo(){ weiboAuthWin = window.open("https://api.weibo.com/oauth2/authorize?client_id=CLIENT_ID&response_type=code&state=register&redirect_uri=http://localhost:9090/logback/weibo.jsp", '微博授权登录','width=770,height=600,menubar=0,scrollbars=1,'+ 'resizable=1,status=1,titlebar=0,toolbar=0,location=1'); } QQ登录 微博登录

2、回调地址页(qq.jsp、weibo.jsp)

DOCTYPE HTML> My JSP 'weibo.jsp' starting page $(function(){ var code = ""; var state = ""; $.ajax({ url:"http://localhost:8080/cms_manage/api/qqLogin", type:"post", data:{code:code,state:state}, dataType:"json", success:function(result){ result = JSON.stringify(result); console.log(result); //把返回的数据传给父窗口的隐藏域中 window.opener.document.getElementById("qq").value = result; //授权完成后,关闭子窗口 window.opener.closeQQWin(); } }); }); 登录成功。

qq.jsp和weibo,jsp是一样的。。。

3、java代码

/** * 微博第三方登录 * @author techbuddy * */ @Controller public class WeiboLoginController { private Logger logger = Logger.getLogger(WeiboLoginController.class); private final static String CLIENT_ID = ""; private final static String CLIENT_SERCRET = ""; private final static String GET_TOKEN_URL = "https://api.weibo.com/oauth2/access_token"; private final static String REDIRECT_URI = "http://localhost:9090/logback/weibo.jsp"; private final static String GET_USER_INFO = "https://api.weibo.com/2/users/show.json"; private final static String GET_TOKEN_INFO_URL = "https://api.weibo.com/oauth2/get_token_info"; private final static String STATE = "register"; @RequestMapping(value="/api/weiboLogin",method=RequestMethod.POST) @ResponseBody public CMS_Result weiboLogin(HttpServletRequest request,HttpServletResponse response){ CMS_Result result = null; String error_code = request.getParameter("error_code"); if(StringUtils.isNotBlank(error_code)){ result = CMS_Result.bulid("5001", "微博授权失败"); }else{ try{ //获取code String code = request.getParameter("code"); logger.info("code:" + code); //获取state String state = request.getParameter("state"); logger.info("state:"+state); String access_token = ""; String expires_in = ""; String uid = ""; if(STATE.equals(state)){ //获取token JSONObject token = getAccessToken(code); access_token = token.getString("access_token"); uid = token.getString("uid"); expires_in = String.valueOf(token.getInt("expires_in")); logger.info("token:"+token); }else{ result = CMS_Result.bulid("5001", "微博授权失败"); } //查询该用户信息 OauthUser oauthUser = oauthUserService.findWeiboByIdentifier(uid); Master master = null; if(oauthUser != null){ master = masterInfoDao.findById(oauthUser.getMaster_id()); }else{ //获取用户信息 JSONObject userInfo = getUserInfo(access_token, uid); logger.info("用户信息"+userInfo); String nickname = userInfo.getString("screen_name"); String profile_image_url = userInfo.getString("profile_image_url"); String gender = "f".equals(userInfo.getString("gender"))?"1":"0"; //向第三方登录表中添加数据 OauthUser user = new OauthUser(); user.setId(UUID.randomUUID().toString()); String master_id = UUID.randomUUID().toString(); user.setMaster_id(master_id); user.setIdentity_type("weibo"); user.setIdentifier(uid); user.setCredential(access_token); user.setExpires_in(expires_in); user.setStatus("0"); oauthUserService.insert(user); //向用户表中添加默认数据 Master masterUser = new Master(); masterUser.setId(master_id); masterUser.setNickname(nickname); masterUser.setHead_portrait(profile_image_url); masterUser.setSex(gender); //由于第三方登录没有用户名密码,而且该字段在数据库中不为空,在此设置默认用户名密码 masterUser.setUser_name("wbu"+access_token.substring(0, 9)); masterUser.setPassword("wbp"+access_token.substring(0, 9)); masterInfoService.insertDefault(masterUser); master = masterUser; } result = CMS_Result.ok(); }catch (Exception e) { e.printStackTrace(); result = CMS_Result.bulid("5001", "登录失败"); } } return result; } /** * 获取AccessToken */ private JSONObject getAccessToken(String code) { StringBuilder sb = new StringBuilder(); sb.append("grant_type=authorization_code"); sb.append("&client_id=" + CLIENT_ID); sb.append("&client_secret=" + CLIENT_SERCRET); sb.append("&redirect_uri=" + REDIRECT_URI); sb.append("&code=" + code); String result = HttpsUtil.post(GET_TOKEN_URL,sb.toString()); /** * 返回数据 * { * "access_token": "ACCESS_TOKEN", * "expires_in": 1234, * "remind_in":"798114", * "uid":"12341234" * } */ JSONObject json = new JSONObject(result); return json; } /** * 获取用户信息 * @param access_token * @param uid 查询的用户ID * @return */ private JSONObject getUserInfo(String access_token,String uid){ StringBuilder sb = new StringBuilder(); sb.append("?access_token=" + access_token); sb.append("&uid=" + uid); String result = HttpsUtil.get(GET_USER_INFO+sb.toString()); //返回参数:查看http://open.weibo.com/wiki/2/users/show JSONObject json = new JSONObject(result); return json; }

  



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有